home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldpcx04
/
ldpcx04s.lzh
/
LDPCX24.S
< prev
next >
Wrap
Text File
|
1997-06-10
|
13KB
|
646 lines
*****************************************************************
* フルカラー用 *
*****************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.xdef _pcx24_prt
.xdef _pcx24_scroll
.xref x_set
.xref y_set
.xref v_wait
.xref inf_change
.xref key_chk
.xref tenkey_chk
.xref cursor_chk
.xref mouse_chk
.xref tate
.xref yoko
.xref x_max
.xref y_max
.xref x_pos
.xref y_pos
.xref gr_addr
.xref kflg
.xref mflg
.xref esc_flg
.xref next_flg
.xref scroll_key
.xref s_dot24
*****************************************************************
* 表示 *
*****************************************************************
_pcx24_prt:
bsr pcx24_prt *表示
rts
*****************************************************************
* スクロール *
*****************************************************************
_pcx24_scroll:
bsr scroll *スクロール
rts
*****************************************************************
* 画像データを一気に表示する *
*****************************************************************
pcx24_prt:
move.w x_pos(pc),gram_x *表示開始座標
move.w y_pos(pc),gram_y
clr.w pcx_x
clr.w pcx_y
move.w yoko(pc),d0
cmp.w #512,d0 *横ドット数が512を超えるか
bls pcx24_prt1
move.w #512,d0
pcx24_prt1:
move.w d0,pcx_xd
move.w d0,x_line
move.w tate(pc),d0
cmp.w #512,d0 *横ドット数が512を超えるか
bls pcx24_prt2
move.w #512,d0
pcx24_prt2:
move.w d0,pcx_yd
move.w d0,y_line
bsr get_pcx_addr
bsr get_gram_addr
tst.b mflg
bne pcx24_prt3
bsr dma_move *DMAで表示
bra pcx24_prt4
pcx24_prt3:
bsr g24 *MPUで表示
pcx24_prt4:
rts
*****************************************************************
* DMAを使ってグラフィックへ転送する *
*****************************************************************
dma_move:
move.w pcx_yd(pc),d0 *転送サイズ縦
move.w pcx_xd(pc),d1 *転送サイズ横
movea.w yoko(pc),a3 *転送元画像の横サイズ
adda.l a3,a3
sub.w #1,d0 *縦ライン-1
move.b #$FF,CSR2
move.b #8,DCR2
btst.l #0,d1 *横ライン数が偶数か
beq dma_move0 *そう
move.b #$11,OCR2 *ワード転送
bra dma_move1
dma_move0:
move.b #$21,OCR2 *ロングワード転送
lsr.w #1,d1 *d1を1/2
dma_move1:
move.b #%0_000_0101,SCR2
move.b #3,CPR2
clr.b CCR2
move.b #5,DFC2
move.b #5,MFC2
dma_move2:
move.w d1,MTC2 *転送サイズ
move.l a1,MAR2 *転送元
move.l a2,DAR2 *転送先
move.b #$80,CCR2
dma_move3:
tst.w MTC2
bne dma_move3
move.b #$FF,CSR2
adda.l a3,a1 *転送元アドレス更新
lea.l 1024(a2),a2 *転送先アドレス更新
dbra.w d0,dma_move2
rts
*****************************************************************
* スクロール制御 *
*****************************************************************
scroll:
moveq.l #0,d2 *スクロール座標初期化
moveq.l #0,d3
clr.w x_old
clr.w y_old
bsr down_demo
bsr right_demo
tst.b kflg *キー入力待ち
beq scroll8 *指定無し
scroll2:
bsr key_chk *キー入力チェック
* bsr mouse_chk *マウスのキー入力チェック
tst.b esc_flg *エスケープ入力有るか
bne scroll9 *指定有り
tst.b next_flg *ネクスト入力有るか
bne scroll9 *指定有り
bsr cursor_chk *カーソル入力チェック
bsr tenkey_chk *テンキー入力チェック
bsr mouse_chk *マウス入力チェック
bsr go_scroll *スクロール実行
bsr v_wait *手抜き
bra scroll2 *キー入力に戻る
scroll8:
bsr key_chk *ESCくらいは入力チェック
bsr mouse_chk *マウスのキー入力チェック
scroll9:
rts
*****************************************************************
* 下方向へ全画面スクロールを行う *
*****************************************************************
down_demo:
tst.w y_max
beq down_demo9
move.w s_dot24(pc),-(sp)
lsr.w s_dot24
down_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne down_demo8
tst.b esc_flg
bne down_demo8
tst.b next_flg
bne down_demo8
bsr v_wait
bsr down
cmp.w y_max(pc),d3
bne down_demo0
down_demo8:
move.w (sp)+,s_dot24
down_demo9:
rts
*****************************************************************
* 右方向へ全画面スクロールを行う *
*****************************************************************
right_demo:
tst.w x_max
beq right_demo9
tst.w d3
bne right_demo9
* move.w y_max(pc),d0
* cmp.w x_max(pc),d0
* bhi right_demo9
move.w s_dot24(pc),-(sp)
lsr.w s_dot24
right_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne right_demo8
tst.b esc_flg
bne right_demo8
tst.b next_flg
bne right_demo8
bsr v_wait
bsr right
cmp.w x_max(pc),d2
bne right_demo0
right_demo8:
move.w (sp)+,s_dot24
right_demo9:
rts
*****************************************************************
* スクロール *
*****************************************************************
go_scroll:
moveq.l #0,d0
move.b scroll_key(pc),d0
add.w d0,d0
add.w d0,d0
movea.l scroll_tbl(pc,d0.w),a0
jsr (a0)
rts
scroll_tbl:
.dc.l null *0000 入力無し
.dc.l left *0001 左
.dc.l up *0010 上
.dc.l left_up *0011 上左
.dc.l right *0100 右
.dc.l null *0101 右左
.dc.l right_up *0110 右上
.dc.l up *0111 右上左
.dc.l down *1000 下
.dc.l left_down *1001 下左
.dc.l null *1010 下上
.dc.l left *1011 下上左
.dc.l right_down *1100 下右
.dc.l down *1101 下右左
.dc.l right *1110 下右上
.dc.l null *1111 下右上左
.even
*****************************************************************
* 入力無し *
*****************************************************************
null:
rts
*****************************************************************
* 右下(手抜き) *
*****************************************************************
right_down:
bsr right
bsr down
rts
*****************************************************************
* 左下(手抜き) *
*****************************************************************
left_down:
bsr left
bsr down
rts
*****************************************************************
* 右上(手抜き) *
*****************************************************************
right_up:
bsr right
bsr up
rts
*****************************************************************
* 左上(手抜き) *
*****************************************************************
left_up:
bsr left
bsr up
rts
*****************************************************************
* 左へ *
*****************************************************************
left:
sub.w s_dot24(pc),d2
tst.w d2
bpl left1
clr.w d2
left1:
bsr x_set
move.w x_old(pc),d5 *何ドットずらすか
sub.w d2,d5
beq left9
move.w d2,d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w d2,pcx_x
move.w d5,pcx_xd
move.w y_old(pc),pcx_y
move.w y_line(pc),pcx_yd
bsr get_pcx_addr *表示
bsr get_gram_addr
bsr g24
move.w d2,x_old
left9:
rts
*****************************************************************
* 上へ *
*****************************************************************
up:
sub.w s_dot24(pc),d3
tst.w d3
bpl up1
clr.w d3
up1:
move.w y_old(pc),d6 *何ドットずらすか
sub.w d3,d6
beq up9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w d3,d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),pcx_x
move.w x_line(pc),pcx_xd
move.w d3,pcx_y
move.w d6,pcx_yd
bsr get_pcx_addr
bsr get_gram_addr
bsr g24
bsr y_set
move.w d3,y_old
up9:
rts
*****************************************************************
* 右へ *
*****************************************************************
right:
add.w s_dot24(pc),d2
cmp.w x_max(pc),d2
bls right1
move.w x_max(pc),d2
right1:
bsr x_set
move.w d2,d5 *何ドットずらすか
sub.w x_old(pc),d5
beq right9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
add.w #512,d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),pcx_x
add.w #512,pcx_x
move.w d5,pcx_xd
move.w y_old(pc),pcx_y
move.w y_line(pc),pcx_yd
bsr get_pcx_addr *表示
bsr get_gram_addr
bsr g24
move.w d2,x_old
right9:
rts
*****************************************************************
* 下へ *
*****************************************************************
down:
add.w s_dot24(pc),d3
cmp.w y_max(pc),d3
bls down1
move.w y_max(pc),d3
down1:
bsr y_set
move.w d3,d6 *何ドットずらすか
sub.w y_old(pc),d6
beq down9
move.w x_old(pc),d0 *表示開始X座標
add.w x_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_x
move.w y_old(pc),d0 *表示開始Y座標
add.w y_pos(pc),d0
and.w #$1ff,d0
move.w d0,gram_y
move.w x_old(pc),pcx_x
move.w x_line(pc),pcx_xd
move.w y_old(pc),pcx_y
add.w #512,pcx_y
move.w d6,pcx_yd
bsr get_pcx_addr *表示
bsr get_gram_addr
bsr g24
move.w d3,y_old
down9:
rts
*****************************************************************
* スクロール分のグラフィックを表示する *
* gram_x, gram_y 表示先座標(GRAM) *
* pcx_x, pcx_y 表示元座標(PCX) *
* pcx_xd, pcx_yd ドット数 *
*****************************************************************
g24:
movem.l d5-d6,-(sp)
move.w pcx_xd(pc),d0 *横ドット数
move.w pcx_yd(pc),d7 *縦ドット数
move.w yoko(pc),d4 *次のラインへのバイト数
sub.w d0,d4 *(転送元)
add.w d4,d4
move.w #512,d5 *表示データの1ライン下までの差分
sub.w d0,d5 *(表示先)
add.w d5,d5
move.w gram_x(pc),d6
add.w pcx_xd(pc),d6
cmp.w #512,d6
bhi g24_2 *左右2回に分けて表示
cmp.w #1,d0 *表示ライン=横1ドット
beq g24_1
cmp.w #8,d0 *表示ライン=横8ドット
beq g24_8
btst.l #0,d0
beq g24_g *表示ライン=偶数
bra g24_k *表示ライン=奇数
g24_1:
subq.w #1,d7 *dbraのため縦-1
g24_11:
move.w (a1)+,(a2)+
adda.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_13
suba.l #GRAM_MAX-GRAM,a2
g24_13:
dbra d7,g24_11
bra g24_end
g24_8:
subq.w #1,d7 *dbraのため縦-1
g24_81:
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
move.l (a1)+,(a2)+
adda.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_83
suba.l #GRAM_MAX-GRAM,a2
g24_83:
dbra d7,g24_81
bra g24_end
g24_g:
lsr.w #1,d0 *1/2
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
g24_g1:
move.w d0,d1
g24_g2:
move.l (a1)+,(a2)+
dbra d1,g24_g2
adda.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_g3
suba.l #GRAM_MAX-GRAM,a2
g24_g3:
dbra d7,g24_g1
bra g24_end
g24_k:
lsr.w #1,d0 *1/2
subq.w #1,d0 *dbraのため-1
subq.w #1,d7 *dbraのため-1
g24_k1:
move.w d0,d1
g24_k2:
move.l (a1)+,(a2)+
dbra d1,g24_k2
move.w (a1)+,(a2)+
adda.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_k3
suba.l #GRAM_MAX-GRAM,a2
g24_k3:
dbra d7,g24_k1
bra g24_end
g24_2: *左右2回に分けて表示
add.w #1024,d5 *1ライン下までの差分を補正
move.w #512,d0 *横ドット1
sub.w gram_x(pc),d0
move.w pcx_xd(pc),d6 *横ドット2
sub.w d0,d6
subq.w #1,d0 *dbraのため-1
subq.w #1,d6 *dbraのため-1
subq.w #1,d7 *dbraのため-1
g24_21:
move.w d0,d1 *右側
g24_22:
move.w (a1)+,(a2)+
dbra d1,g24_22
g24_23:
move.w d6,d1 *左側
lea.l -1024(a2),a2
g24_24:
move.w (a1)+,(a2)+
dbra d1,g24_24
adda.w d4,a1 *変換元アドレス更新
adda.w d5,a2 *表示先アドレス更新
cmpa.l a3,a2
bcs g24_25
suba.l #GRAM_MAX-GRAM,a2
g24_25:
dbra d7,g24_21
g24_end:
movem.l (sp)+,d5-d6
rts
*****************************************************************
* PCXデータのアドレスを取得(a1) *
*****************************************************************
get_pcx_addr:
move.w yoko(pc),d0 *yoko*2*pcx_y+pcx_x*2+gr_addr
add.w d0,d0
mulu.w pcx_y(pc),d0
add.l gr_addr(pc),d0
movea.l d0,a1
move.w pcx_x(pc),d1
add.w d1,d1
adda.w d1,a1
rts
*****************************************************************
* GRAMのアドレスを取得(a2) *
*****************************************************************
get_gram_addr:
move.w gram_x(pc),d0 *表示先画像アドレス
move.w gram_y(pc),d1
swap.w d1
clr.w d1
ror.l #6,d1
add.w d0,d0
add.w d0,d1
movea.l d1,a2
adda.l #GRAM,a2
movea.l #GRAM_MAX,a3 *GRAM_MAX
rts
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
gram_x .ds.w 1 *表示する座標(GRAM)
gram_y .ds.w 1
pcx_x .ds.w 1 *表示する座標(PCX)
pcx_y .ds.w 1
pcx_xd .ds.w 1 *表示するドット数
pcx_yd .ds.w 1
x_line:
.ds.w 1 *横ドット数
y_line:
.ds.w 1 *縦ドット数
x_old:
.ds.w 1 *前回のX座標
y_old:
.ds.w 1 *前回のY座標
.even